#include "dp_table.h"

int type = -1;
int period = -1;

// 解析点表（来源可以是文件、JSON 等）
void dp_table_parse(void *dp_p)
{
    // 点表中的设备名词，此处只包含stm32和modbus，如果添加其他自行修改
    char *device_list[] = {"stm32", "modbus"};
    // count存储每个数组长度，length存储总长度
    int count = 0, length = 0;
    char buf[4096] = {};
    // 共享内存指针偏移一个int类型
    dp_node_p temp = (dp_node_p)((char *)dp_p + sizeof(int));
    // 打开点表文件
    FILE *node = fopen("../resources/node.json", "r");
    if (node == NULL)
    {
        perror("open node.json");
        return;
    }
    fread(buf, 1, sizeof(buf) - 1, node);
    fclose(node);
    // 解析点表
    int device_count = sizeof(device_list) / sizeof(device_list[0]);
    cJSON *root = cJSON_Parse(buf);

    type = cJSON_GetObjectItem(cJSON_GetObjectItem(root, "report"), "type")->valueint;
    period = cJSON_GetObjectItem(cJSON_GetObjectItem(root, "report"), "period")->valueint;
    for (int i = 0; i < device_count; i++)
    {
        cJSON *arr = cJSON_GetObjectItem(root, device_list[i]);
        cJSON *data = cJSON_GetObjectItem(arr, "data");
        count = cJSON_GetArraySize(data);
        length += count;
        for (int j = 0; j < count; j++)
        {
            cJSON *item = cJSON_GetArrayItem(data, j);
            if (!item)
                continue;

            cJSON *key = cJSON_GetObjectItem(item, "key");
            cJSON *type = cJSON_GetObjectItem(item, "type");
            // if (!cJSON_IsNumber(key) || !cJSON_IsNumber(type))
            //     continue;

            temp->key = key->valueint;
            temp->type = type->valueint;
            temp->dev_type = i+1;
            temp->ret = -1;
            temp++;
        }
    }
    *(int *)dp_p = length;
    cJSON_Delete(root);
    printf("dp_table_parse successfully\n");
}
// void dp_table_init(); // 初始化结构体数组或默认点表
// void dp_table_free(); // 释放点表占用资源（如有动态分配）
